#pragma once
#include"datamanage.hpp"
#include<unistd.h>
extern Cloud::DataManager *_data;
namespace Cloud
{
  class HotManager
  {
    public:
      HotManager()
      {
        Cloud::Config *config=Cloud::Config::GetInstance();
        _backup_dir=config->GetBackupDir();
        _pack_dir=config->GetPackDir();
        _pack_suffix=config->GetPackfileSuffix();
        _hot_time=config->GetHotTime();
        //目录不存在的话就创建
        Cloud::FileUtil tmp1(_backup_dir);
        Cloud::FileUtil tmp2(_pack_dir);
        tmp1.CreateDir();
        tmp2.CreateDir();
      }
      //运行模块
      bool RunModule()
      {
        while(true)
        {
          //1.遍历备份目录，获取所有文件名
          Cloud::FileUtil fu(_backup_dir);
          std::vector<std::string> arr;
          fu.ScanDir(&arr);

          //2.遍历判断文件是否是非热点文件
          for(auto &filename:arr)
          {
            if(IsHot(filename)==true)
            {
              //热点文件不必理会
              continue;
            }
          //3.获取文件备份信息
            Cloud::BackupInfo bi;
            if(_data->GetOneByRealPath(filename,&bi)==false)
            {
              //进入这个判断就说明 文件存在，但没有备份信息
              //设置一个新的备份信息
              bi.SetBackupInfo(filename);
            }
          //4.如果是非热点文件就对其进行压缩存储
            Cloud::FileUtil tmp(filename);
            tmp.Compress(bi.pack_path);
          //5.删除源文件，修改备份信息
            tmp.Remove();
            bi.pack_flag=true;
            _data->Updata(bi);
            }
          //1毫秒检查一次,避免空目录情况下遍历循环目录消耗资源过多
            usleep(1000);
          }
        } 
    private:
      //热点判断,热点文件返回真，非热点文件返回假
      bool IsHot(const std::string &filename)
      {
        Cloud::FileUtil fu(filename);
        time_t last_atime=fu.LastAtime();
        time_t now_time=time(nullptr);
        //非热点文件
        if(now_time-last_atime>_hot_time)
        {
          return false;
        }
        return true;
      }
    private:
      std::string _backup_dir;
      std::string _pack_dir;
      std::string _pack_suffix;
      int _hot_time;
  };
}
